package ufc.rafaelcds.combudroid.dao;

import java.util.ArrayList;
import java.util.List;

import ufc.rafaelcds.combudroid.misc.CombuDroidException;
import ufc.rafaelcds.combudroid.model.Abastecimento;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class AbastecimentoDAO extends SQLiteOpenHelper {

	private static int VERSION = 1;
	private static String TABELA = "Abastecimento";
	private static String[] COLUNAS = {"id", "km_rodados", "qtde_litros", "preco_litro"};
	
	public AbastecimentoDAO(Context context) {
		super(context, TABELA, null, VERSION);
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = 
				"CREATE TABLE " + TABELA + "(" 
				+ " id INTEGER PRIMARY KEY,"
				+ " km_rodados INTEGER,"
				+ " qtde_litros REAL,"
				+ " preco_litro REAL"
				+ ")";
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS " + TABELA);
	}
	
	/**
	 * Cadastra um novo abastecimento e atualiza a quantidade de quilômetros rodados do último abastecimento, se houver.
	 * @param abastecimento
	 * @throws CombuDroidException 
	 */
	public void insert(Abastecimento abastecimento) throws CombuDroidException {		
		//Verifica se não é o primeiro abastecimento
		if (!abastecimento.primeiroAbastecimento) {
			//Procura pelo último abastecimento feito:
			Cursor query = getReadableDatabase().query(TABELA, new String[] {"MAX(id)"}, null, null, null, null, null);
			
			if (query.moveToNext()) {
				int ultimoId = query.getInt(query.getColumnIndex("MAX(id)"));
				query.close();
				
				//Atualiza o campo km_rodados do último abastecimento:
				ContentValues valores = new ContentValues();
				valores.put("km_rodados", abastecimento.kmRodados);
				getWritableDatabase().update(TABELA, valores, "id = ?", new String[] { Integer.toString(ultimoId) });
			}
		}
		
		//Armazena o abastecimento que está sendo cadastro com número de km_rodados igual a zero:
		ContentValues valores = new ContentValues();
		valores.put("km_rodados", 0);
		valores.put("qtde_litros", abastecimento.qtdeLitros);
		valores.put("preco_litro", abastecimento.precoLitro);
		
		getWritableDatabase().insert(TABELA, null, valores);
	}
	
	public Double getQtdeLitrosUltimoAbastecimento() {
		Cursor query = getReadableDatabase().query(TABELA, new String[] {"MAX(id)", "qtde_litros"}, null, null, null, null, null);
		Double qtdeLitros = null;
		if (query.moveToLast() && !query.isNull(query.getColumnIndex("qtde_litros"))) {
			qtdeLitros = query.getDouble(query.getColumnIndex("qtde_litros"));
		}
		query.close();
		return qtdeLitros;
	}
	
	public List<Abastecimento> getTresUltimosAbastecimentos() {
		Cursor query = getReadableDatabase().query(TABELA, COLUNAS, null, null, null, null, null);
		List<Abastecimento> lista = new ArrayList<Abastecimento>();
		if (query.moveToLast()) {
			while (query.moveToPrevious()) {
				Abastecimento abastecimento = new Abastecimento();
				abastecimento.id = query.getInt(query.getColumnIndex("id"));
				abastecimento.kmRodados = query.getInt(query.getColumnIndex("km_rodados"));
				abastecimento.qtdeLitros = query.getDouble(query.getColumnIndex("qtde_litros"));
				abastecimento.precoLitro = query.getDouble(query.getColumnIndex("preco_litro"));
				
				lista.add(abastecimento);
			}
		}
		query.close();
		return lista;
	}
	
	public void clear() {
		SQLiteDatabase writableDatabase = getWritableDatabase();
		writableDatabase.delete(TABELA, null, null);
		writableDatabase.close();
	}

}
